"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
" 通用设置
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
let mapleader = ","      " 定义<leader>键
set nocompatible         " 设置不兼容原始vi模式
filetype on              " 设置开启文件类型侦测
filetype plugin on       " 设置加载对应文件类型的插件
"filetype plugin indent on " 打开文件类型检测和自动缩进
syntax enable            " 开启语法高亮功能
syntax on                " 自动语法高亮
set noeb                 " 关闭错误的提示
set t_Co=256             " 开启256色支持
set cmdheight=2          " 设置命令行的高度
set showcmd              " select模式下显示选中的行数
set ruler                " 总是显示光标位置
set laststatus=2         " 总是显示状态栏
set number               " 开启行号显示
set nospell              " 关闭拼写检查功能
set cursorline           " 高亮显示当前行
set cursorcolumn         " 高亮显示当前列
set whichwrap+=<,>,h,l   " 设置光标键跨行
set iminsert=0           " 禁用输入法在 插入 模式下的自动切换
set imsearch=-1          " 禁用输入法在 搜索 模式下的自动切换
set showmatch            " 高亮显示匹配项
set hidden               " 允许在后台打开多个文件
set incsearch            " 搜索时高亮度反白匹配项
set nowrapscan           " 禁止搜索到文件末尾时自动回到文件头
set autowrite            " 自动保存文件
set autoread             " 自动读取被修改过的文件
set paste                " 粘贴模式下不自动缩进和换行
set mouse=a              " 允许使用鼠标
set clipboard+=unnamed   " 共享剪贴板
set selection=exclusive  " 设置选择模式为exclusive模式，即只能使用鼠标或Shift键选择文本
set selectmode=mouse,key " 设置选择模式为mouse和key模式，即可以使用鼠标或Shift键选择文本，并且可以使用Ctrl键复制和粘贴文本
set ttimeoutlen=0        " 设置<ESC>键响应时间
set autochdir            " 设置 Vim 在打开文件时自动切换当前工作目录
set tags=tags            " 设置 Vim 使用名为 "tags" 的标签文件来进行代码导航
set virtualedit=block,onemore       " 允许光标出现在最后一个字符的后面
set list listchars=tab:>-,trail:-   " 显示制表符和行末空格符号（制表符用">-"表示）

" 搜索时忽略大小写（smartcase表示在搜索时如果有一个以上大写字母，则区分大小写）
set smartcase hlsearch cscopetag cscopetagorder=0

" 主题设置
set background=dark
let g:onedark_termcolors=256
colorscheme gruvbox
"colorscheme happy_hacking
"colorscheme monokai
"colorscheme onedark
"colorscheme hybrid
"colorscheme ayu

"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
" 代码缩进和排版
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
set autoindent           " 设置自动缩进
set cindent              " 设置使用C/C++语言的自动缩进方式
set cinoptions=g0,:0,N-s,(0    " 设置C/C++语言的具体缩进方式
set smartindent          " 智能的选择对其方式
filetype indent on       " 自适应不同语言的智能缩进
set expandtab            " 将制表符扩展为空格
set tabstop=4            " 设置编辑时制表符占用空格数
set shiftwidth=4         " 设置格式化时制表符占用空格数
set softtabstop=4        " 设置4个空格为制表符
set smarttab             " 在行和段开始处使用制表符
set nowrap               " 禁止折行
set backspace=2          " 使用回车键正常处理indent,eol,start等
set sidescroll=10        " 设置向右滚动字符数
set nofoldenable         " 禁用折叠代码

"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
" 代码补全
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
set wildmenu             " vim自身命名行模式智能补全
set completeopt-=preview " 补全时不显示窗口，只显示补全列表
set sm                   " 设置自动匹配括号
set matchtime=10         " 设置匹配括号的时间为10秒钟
inoremap ( ()<LEFT>      " 设置自动补全括号
inoremap { {}<LEFT>
inoremap [ []<LEFT>

"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
" 搜索设置
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
set hlsearch            " 高亮显示搜索结果
set incsearch           " 开启实时搜索功能
set ignorecase          " 搜索时大小写不敏感
set cscopetag           " 打开 Vim 的 cscope 标签支持
set cscopetagorder=0    " 设置 cscope 标签搜索顺序
" set smartcase         " 智能大小写: 搜索时如果有一个以上大写字母，则区分大小写

"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
" 缓存设置
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
set nobackup            " 设置不备份
set noswapfile          " 禁止生成临时文件
set autoread            " 文件在vim之外修改过，自动重新读入
set autowrite           " 设置自动保存
set confirm             " 在处理未保存或只读文件的时候，弹出确认

"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
" 编码和字体设置
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
set langmenu=zh_CN.UTF-8
set helplang=cn
set termencoding=utf-8
set encoding=utf8
set fileencodings=utf8,ucs-bom,gbk,cp936,gb2312,gb18030
" 设置字体为Consolas:h12:cANSI（英文字体）和Microsoft_YaHei_Mono_Ult_Light:h12:cANSI（中文字体）
set guifont=Consolas:h12:cANSI set guifontwide=Microsoft_YaHei_Mono_Ult_Light:h12:cANSI

"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
" 卸载默认插件UnPlug
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
function! s:deregister(repo)
    let repo = substitute(a:repo, '[\/]\+$', '', '')
    let name = fnamemodify(repo, ':t:s?\.git$??')
    call remove(g:plugs, name)
endfunction
command! -nargs=1 -bar UnPlug call s:deregister(<args>)

"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
" 插件列表
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
call plug#begin('~/.vim/plugged')
" ctags好伴侣，自动调用ctags生成tag，能够增量管理
Plug 'ludovicchabant/vim-gutentags'
" Tagbar类似于outline, 展示当前文件的函数，变量，类等声明
Plug 'preservim/tagbar'
" 用于插入代码片段
" ultisnips是snippets的管理器
Plug 'SirVer/ultisnips'
" vim-snippets是具体snippets的定义，可添加自己定义的代码片段
Plug 'honza/vim-snippets'
" 安装强大的LSP客户端coc,用于自动补全，语法检查，定义跳转，支持各种语言
Plug 'neoclide/coc.nvim', {'branch': 'release', 'do': 'yarn install --frozen-lockfile'}
" vim-go是golang的开发插件，项目地址：https://github.com/fatih/vim-go，帮助:help vim-go
Plug 'fatih/vim-go', { 'do': ':GoInstallBinaries' }
" vim solidity 语言支持
Plug 'tomlion/vim-solidity'
" LeaderF: 高效的模糊查找器，有助于动态定位文件、缓冲区、mrus、gtag 等。
Plug 'Yggdroot/LeaderF'
" GruvBox 主题
Plug 'morhetz/gruvbox'

" 加载自定义插件
if filereadable(expand($HOME . '/.vimrc.custom.plugins'))
    source $HOME/.vimrc.custom.plugins
endif
call plug#end()

" 加载 vim 默认插件
runtime macros/matchit.vim

"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
" 快捷键和拓展功能
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
" 安装、更新、删除插件
nnoremap <leader><leader>i :PlugInstall<cr>
nnoremap <leader><leader>u :PlugUpdate<cr>
nnoremap <leader><leader>c :PlugClean<cr>

" 分屏窗口移动
nnoremap <c-j> <c-w>j
nnoremap <c-k> <c-w>k
nnoremap <c-h> <c-w>h
nnoremap <c-l> <c-w>l

" 复制当前选中到系统剪切板
vmap <leader><leader>y "+y

" 将系统剪切板内容粘贴到vim
nnoremap <leader><leader>p "+p

"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
" 自动执行命令
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
" Java 文件
function AutoJava()
	call append(0, "/**")
	call append(1, " *@author Maximo")
	call append(2, " *@version ".expand("%:t").", v0.1 ".strftime("%Y-%m-%d %H:%M")." Moss")
	call append(3, " */")
	normal G
	normal o
endf
autocmd bufnewfile *.java call AutoJava()

" shell 文件
function AutoShell()
    call setline(1, "#!/usr/bin/env bash")
    call setline(2, "# ----------------------------------------------")
    call setline(3, "# Author      : Maximo <jonny0624@gmail.com>")
    call setline(4, "# Created on  : ".strftime("%Y-%m-%d %H:%M"))
    call setline(5, "# Description : ")
    call setline(6, "# ----------------------------------------------")
    call setline(7, "#")
	normal G
	normal o
endf
autocmd bufnewfile *.sh call AutoShell()

" 打开文件自动定位到最后编辑的位置
autocmd BufReadPost * if line("'\"") > 1 && line("'\"") <= line("$") | execute "normal! g'\"" | endif

" 如果打开的是C或C++文件，则使用空格代替Tab键进行缩进。
autocmd BufRead,BufNewFile *.c,*.h set expandtab


"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
" 加载自定义配置
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
if filereadable(expand($HOME . '/.vimrc.custom.config'))
    source $HOME/.vimrc.custom.config
endif

